from PIL import Image
from PIL import ImageFilter
'''
convert
Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)

参数说明：
mode：转换的模式
matrix：可选转变矩阵。如果给出，必须为包含浮点值长为 4 或 12 的元组。
dither：抖动方法。RGB 转换为 P；RGB 或 L 转换为 1 时使用。有 matrix 参数可以无 dither。参数值 NONE 或 FLOYDSTEINBERG（默认）。
palette：调色板，在 RGB 转换为 P 时使用， 值为 WEB 或 ADAPTIVE 。
colors：调色板的颜色值，默认 256.
'''
# im = Image.open('cat.png')
# im.show()
# # 将图像转换成黑白色并返回新图像
# im1 = im.convert('L')
# im1.show()

'''
copy
Image.copy()
'''
# im = Image.open('cat.png')
# im.copy()
# im.save('cat2.png')

'''
crop 抠图
Image.crop(box)

参数说明：
box：相对图像左上角坐标为（0,0）的矩形坐标元组, 顺序为(左, 上, 右, 下)
'''
# im = Image.open('cat.png')
# print(im.size)
# im.show()
# # 定义了图像的坐标位置，从左、上、右、下
# box = (100, 100, 250, 250)
# # 它会从左上角开始，同时向下和向右移动100像素的位置开始截取250-100的像素宽高，也就是150x150的图像
# # 这里注意后两个数值要大于前两个数值，不然截取后的图像宽高为负数，会报错
# region = im.crop(box)
# print(region.size)
# region.show()

'''
filter
Image.filter(filter)

参数说明：

filter：过滤内核
使用给定的筛选器筛选此图像。有关可用筛选器的列表：

筛选器名称	                    说明
BLUR	            模糊滤波，处理之后的图像会整体变得模糊。
CONTOUR	            轮廓滤波，将图像中的轮廓信息全部提取出来。
DETAIL	            细节增强滤波，会使得图像中细节更加明显。
EDGE_ENHANCE	    边缘增强滤波，突出、加强和改善图像中不同灰度区域之间的边界和轮廓的图像增强方法。
EDGE_ENHANCE_MORE	深度边缘增强滤波，会使得图像中边缘部分更加明显。
EMBOSS	            浮雕滤波，会使图像呈现出浮雕效果。
FIND_EDGES	        寻找边缘信息的滤波，会找出图像中的边缘信息。
SHARPEN	            锐化滤波，补偿图像的轮廓，增强图像的边缘及灰度跳变的部分，使图像变得清晰。
SMOOTH	            平滑滤波，突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分，使图像亮度平缓渐变，减小突变梯度，改善图像质量。
SMOOTH_MORE	        深度平滑滤波，会使得图像变得更加平滑。
'''
# im = Image.open('cat.png')
# im.show()
# # 模糊
# im2 = im.filter(ImageFilter.BLUR)
# im2.show()
# # 轮廓滤波
# im3 = im.filter(ImageFilter.CONTOUR)
# im3.show()
# # 细节增强
# im4 = im.filter(ImageFilter.DETAIL)
# im4.show()

'''
getbands
Image.getbands()

返回一个包含此图像中每个通道名称的元组
'''
# 打开图像
# im = Image.open('cat.png')
# # 创建新图像
# im1 = Image.new('L', (450, 450), 50)
#
# # 获取图像的通道名称元组
# print(im.getbands())
# print(im1.getbands())

'''
getbbox
Image.getbbox()

计算图像中非零区域的边界框。将边界框作为定义左、上、右和下像素坐标的四元组返回
'''
# 打开图像(451x300)
# im = Image.open('cat.png')
# # 创建新图像(450x450)
# im1 = Image.new('L', (450, 450), 50)
#
# # 打印图像中非零区域的边界框
# print(im.getbbox())
# print(im1.getbbox())

'''
getcolors
Image.getcolors(maxcolors=256)

参数说明：

maxcolors：最大颜色数。默认限制为256色。
获取图像中颜色的使用列表，超过 maxcolors 设置值返回 None 。 返回值为 (count, pixel) 的列表，表示（出现的次数，像素的值）
'''
# im = Image.open('cat.png')
#
# # 将彩色图像转换成灰度图
# im2 = im.convert("L")
#
# # 打印灰度图的颜色列表，返回的点数超过maxcolors就直接返回None
# print(im2.getcolors(maxcolors=200))
# print(im2.getcolors(maxcolors=255))

'''
getdata
Image.getdata(band=None)

参数：

band：获取对应通道值。如：RGB 图像像素值为 (r,g,b) 的元组，要返回单个波段，请传递索引值（例如0，从 RGB 图像中获取 R 波段）。
获取图像中每个像素的通道对象元组，像素获取从左至右，从上至下。
'''
# im = Image.open('cat.png')
# data = im.getdata()
# print("一共%s个波段" %len(data))

'''
getextrema
Image.getextrema()

获取图像中每个通道的最小值与最大值。对于单波段图像，包含最小和最大像素值的2元组。对于多波段图像，每个波段包含一个2元组的元组
'''
# im = Image.open('cat.png')
# data = im.getextrema()
# for i in data:
#     print(i)

'''
getpixel
Image.getpixel(xy)

参数：

xy：坐标，以（x，y）表示。
通过传入坐标返回像素值。如果图像是多层图像，则此方法返回元组
'''
# im = Image.open('cat.png')
# data = im.getpixel((100, 200))
# print(data)

'''
point
Image.point(lut, mode=None)

参数说明：

lut：一个查找表，包含图像中每个波段的256个（或65536个，如果 self.mode==“I” 和 mode==“L”）值。可以改用函数，它应采用单个参数。对每个可能的像素值调用一次函数，
结果表将应用于图像的所有带区。
mode：输出模式（默认与输入相同）。只有当源图像具有模式 “L” 或 “P” ，并且输出具有模式 “1” 或源图像模式为 “I” ，并且输出模式为 “L” 时，才能使用此选项。

对图像的的每个像素点进行操作，返回图像的副本

我们先将图像转换成 L 模式，然后调整对比度，以及将图像的三个通道分别调整对比度。
所谓调整对比度，我们这个例子的规则就是当像素值小于80时，将其调整为255，相当于将接近黑色的像素点加黑，使其与浅色对比更明显。运
'''
# im = Image.open('cat.png')
#
# # 调整灰色图像的对比度
# im_point=im.convert('L').point(lambda i: i < 80 and 255)
# im_point.show()
#
# source = im.split()
# # 三通道分别处理对比度
# band_r = source[0].point(lambda i: i < 80 and 255)
# band_g = source[1].point(lambda i: i < 80 and 255)
# band_b = source[2].point(lambda i: i < 80 and 255)
# band_r.show()
# band_g.show()
# band_b.show()

'''
esize
Image.resize(size, resample=0, box=None)

参数说明：

size：以像素为单位的请求大小，作为2元组：（宽度、高度）。
resample：可选的重新采样滤波器。可以是 PIL.Image.NEAREST（最近滤波） ，
PIL.Image.ANTIALIAS （平滑滤波），
PIL.Image.BILINEAR （双线性滤波），
PIL.Image.HAMMING ， PIL.Image.BICUBIC （双立方滤波）。
如果省略，或者图像具有模式 “1” 或 “P” ，则设置为 PIL.Image.NEAREST 。 
-box：一个可选的4元组的浮点数，给出了应该缩放的源图像区域。值应在（0，0，宽度，高度）矩形内。如果省略或没有，则使用整个源。
这个方法是获取调整大小后的图片。通俗地讲就是在原图中抠一个矩形区域（如果传入了 box 参数），
然后对抠出来的区域进行滤波处理（如果传入了 resample 参数），最后以指定的 size 大小进行返回。
'''
# im = Image.open('cat.png')
#
# img1 = im.resize((250, 250), Image.BILINEAR)
# img2 = im.resize((250, 250), Image.BICUBIC)
# img3 = im.resize((250, 250), Image.NEAREST)
#
# im.show()
# img1.show()
# img2.show()
# img3.show()

# 参考：https://www.osgeo.cn/pillow/reference/
